/* IO_int.c */

#include "fire_led.h"
#include "stm32f4xx_hal.h"
#include "stm32f4xx_it.h"
#include <stdbool.h>

bool key_interupt = false;

/* Private function prototypes -----------------------------------------------*/
static void SystemClock_Config(void);

int main()
{
   GPIO_PinState ps;

   /* STM32F4xx HAL library initialization:
    - Configure the Flash prefetch, instruction and Data caches
    - Configure the Systick to generate an interrupt each 1 msec
    - Set NVIC Group Priority to 4
    - Global MSP (MCU Support Package) initialization
   */
   HAL_Init();

   /* Configure the system clock to 180 MHz */
   SystemClock_Config();

   LED_KEY_Config();
   EXTILine13_15_Config();

	while(1)
	{
		ps = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
		if (ps == GPIO_PIN_RESET)
		{
			/* green blink */
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_10, GPIO_PIN_SET);
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_11, GPIO_PIN_RESET);
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_12, GPIO_PIN_SET);
         HAL_Delay(500);
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_10, GPIO_PIN_SET);
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_11, GPIO_PIN_SET);
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_12, GPIO_PIN_SET);
         HAL_Delay(500);
		}
		else
		{
			/* red on */
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_10, GPIO_PIN_RESET);
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_11, GPIO_PIN_SET);
         HAL_GPIO_WritePin(LED_GPIO_PORT, GPIO_PIN_12, GPIO_PIN_SET);
		}

        if (key_interupt)
        {
        	/* blue once */
        	fire_LED(BLUE);
        	HAL_Delay(500);
        	key_interupt = false;
        }
	}
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_13)
	{
		key_interupt = true;
	}
}

static void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  /* Enable Power Control clock */
  __HAL_RCC_PWR_CLK_ENABLE();

  /* The voltage scaling allows optimizing the power consumption when the device is 
     clocked below the maximum system frequency, to update the voltage scaling value 
     regarding system frequency refer to product datasheet.  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /* Enable HSE Oscillator and activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 360;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
  
  /* Activate the Over-Drive mode */
  HAL_PWREx_EnableOverDrive();
  
  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 
     clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}
